"""
难度：中等
我们把只包含质因子 2、3 和 5 的数称作丑数（Ugly Number）。
求按从小到大的顺序的第 n 个丑数。
示例:
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
说明:  
1 是丑数。
n 不超过1690。
"""
"""动态规划求解。

定义状态 dp[i] 表示第 i 个丑数。

状态转移方程为：
dp[i] = min(dp[p2] * 2, dp[p3] * 3, dp[p5] * 5) ，
其中 p2、p3、p5 分别表示当前 i 中 2、3、5 的质因子数量。"""
class Solution(object):
    def nthUglyNumber(self, n):
        """
        :type n: int
        :rtype: int
        """
        dp = [1 for _ in range(n)]
        p2, p3, p5 = 0, 0, 0
        for i in range(1, n):
            dp[i] = min(dp[p2]*2, dp[p3]*3, dp[p5]*5)
            if dp[i] == dp[p2] * 2:
                p2 += 1
            if dp[i] == dp[p3] *3:
                p3 += 1
            if dp[i] == dp[p5] * 5:
                p5 += 1
        return dp[n-1]

